/**
 * 
 */
package mm.front.jsf.mb;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;

import mm.back.entity.Reparacion;
import mm.back.entity.Vendedor;
import mm.back.filtros.ReparacionesFiltro;
import mm.back.service.ReparacionService;
import mm.back.service.impl.ReparacionServiceImpl;
import mm.exceptions.MMInvalidIDException;
import mm.front.jsf.ConstantesOutcome;
import mm.front.jsf.JSFUtils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 * @author PUSDERKIS
 *
 */

@Component("reparacionesBean")
@Scope(value="view")
public class ReparacionesManagedBean extends MMAbstractManagedBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1188861244127969799L;
	
	@Autowired
	private ReparacionService reparacionService;
	
	private ReparacionesFiltro reparacionFiltro;
	
	private Reparacion reparacion;
	
	private Vendedor vendedor;
	
	private List<Reparacion> reparacionesList;
	
	private boolean popupModificar = false;
	
	@PostConstruct
	public void init(){
		if (reparacion == null){
			reparacion = new Reparacion();
		}
		if (vendedor == null){
			vendedor = new Vendedor();
		}
		if (reparacionFiltro == null){
			reparacionFiltro = new ReparacionesFiltro();
		}
		reparacionFiltro.setIdVendedor(vendedor.getId());
	}
	
	public String guardarReparacion(){
		
		if (logger.isDebugEnabled()){
			logger.debug("Creando una nueva reparacion: " + reparacion);
		}
		reparacion.setVendedor(vendedor);
		
		try{
			reparacionService.createReparacion(reparacion);
		} catch (MMInvalidIDException e) {
			logger.error("Se intento guardar una reparacion con id invalido: "+reparacion);
			JSFUtils.addErrorMessage("Ya existe una reparación con el mismo número de reparación.");
			return null;
		}
		
		if (logger.isDebugEnabled()){
			logger.debug("Se genero la reparacion con exito.");
		}
		
		FacesMessage fm = new FacesMessage("Reparacion registrada con éxito.");
		fm.setSeverity(FacesMessage.SEVERITY_INFO);
		
		return ConstantesOutcome.REPARACION_LISTADO;
		
	}
	
	public void modificarReparacion(Long id){
		reparacion = reparacionService.getReparacion(id);
		popupModificar = true;
	}
	
	public void cerrarPopupModificar(){
		popupModificar = false;
	}
	
	public void actualizarReparacion(Reparacion reparacion){
		
		logger.info("Actualizando la reparacion: "+reparacion);
		try{
			reparacionService.saveReparacion(reparacion);
		} catch (MMInvalidIDException e) {
			logger.error("Fallo al acutalizar una reparacion.",e);
			JSFUtils.addErrorMessage("No se pudo guardar la reparación. Contactese con un administrador para obtener mas detalles.");
		}
		cerrarPopupModificar();
		JSFUtils.addInfoMessage("Reparación modificada con éxito.");
	}
	
	/**
	 * carga todas las reparaciones en base al filtro de busqueda de reparaciones.
	 */
	public void cargarReparaciones(){
		reparacionesList = reparacionService.searchReparaciones(getReparacionFiltro());
	}
	
		
	/**
	 * @return the reparacion
	 */
	public Reparacion getReparacion() {
		return reparacion;
	}

	/**
	 * @param reparacion the reparacion to set
	 */
	public void setReparacion(Reparacion reparacion) {
		this.reparacion = reparacion;
	}

	/**
	 * @return the vendedor
	 */
	public Vendedor getVendedor() {
		return vendedor;
	}

	/**
	 * @param vendedor the vendedor to set
	 */
	public void setVendedor(Vendedor vendedor) {
		this.vendedor = vendedor;
	}

	/**
	 * @param reparacionService the reparacionService to set
	 */
	public void setReparacionService(ReparacionServiceImpl reparacionService) {
		this.reparacionService = reparacionService;
	}

	/**
	 * @return the reparacionService
	 */
	public ReparacionService getReparacionService() {
		return reparacionService;
	}

	/**
	 * @param reparacionService the reparacionService to set
	 */
	public void setReparacionService(ReparacionService reparacionService) {
		this.reparacionService = reparacionService;
	}

	/**
	 * @return the reparacionFiltro
	 */
	public ReparacionesFiltro getReparacionFiltro() {
		return reparacionFiltro;
	}

	/**
	 * @param reparacionFiltro the reparacionFiltro to set
	 */
	public void setReparacionFiltro(ReparacionesFiltro reparacionFiltro) {
		this.reparacionFiltro = reparacionFiltro;
	}

	/**
	 * @return the reparacionesList
	 */
	public List<Reparacion> getReparacionesList() {
		return reparacionesList;
	}

	/**
	 * @param reparacionesList the reparacionesList to set
	 */
	public void setReparacionesList(List<Reparacion> reparacionesList) {
		this.reparacionesList = reparacionesList;
	}

	/**
	 * @return the popupModificar
	 */
	public boolean isPopupModificar() {
		return popupModificar;
	}

	/**
	 * @param popupModificar the popupModificar to set
	 */
	public void setPopupModificar(boolean popupModificar) {
		this.popupModificar = popupModificar;
	}
	

}
